home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / yacas_alg / yacas_morphos / share / yacas / radsimp.rep / code.ys < prev   
Encoding:
Text File  |  2002-03-13  |  1.1 KB  |  64 lines

  1.  
  2. /* Simplification of nested radicals.
  3. */
  4.  
  5. RadSimp(_n) <--
  6. [
  7.   Local(max);
  8.   Set(max, MathCeil(N(n^2)));
  9.   Set(result,0);
  10.   Set(result,RadSimpTry(n,0,1,max));
  11.   if (CheckRadicals(n,result))
  12.     result
  13.   else
  14.     n;
  15. ];
  16.  
  17. /*Echo({"Try ",test}); */
  18.  
  19. CheckRadicals(_n,_test) <-- Abs(N(n-test,20)) < 0.000001;
  20.  
  21. 10 # ClampRadicals(_r)_(Abs(r)<0.000001) <-- 0;
  22. 20 # ClampRadicals(_r) <-- r;
  23.  
  24.  
  25.  
  26. RadSimpTry(_n,_result,_current,_max)<--
  27. [
  28.   if (LessThan(N(result-n), 0))
  29.   [
  30.     Local(i);
  31.  
  32.     // First, look for perfect match
  33.     i:=BSearch(max,Hold({{try},ClampRadicals(N((result+Sqrt(try))-n,20))}));
  34.     If(i>0,
  35.     [
  36.       Set(result,result+Sqrt(i));
  37.       Set(i,MathAdd(max,1));
  38.       Set(current,MathAdd(max,1));
  39.     ]);
  40.  
  41.     // Otherwise, search for another solution
  42.     if (LessThan(N(result-n), 0))
  43.     [
  44.       For (Set(i,current),i<=max,Set(i,MathAdd(i,1)))
  45.       [
  46.         Local(new, test);
  47.         Set(test,result+Sqrt(i));
  48.  
  49. /* Echo({"Full-try ",test}); */
  50.  
  51.         Set(new,RadSimpTry(n,test,i,max));
  52.     if (CheckRadicals(n,new))
  53.         [
  54.           Set(result,new);
  55.           Set(i,MathAdd(max,1));
  56.         ];
  57.       ];
  58.     ];
  59.   ];
  60.   result;
  61. ];
  62.  
  63.  
  64.